/* eslint-disable no-undef */
/**
 * 初始化海康web视频
 * @param {String} containerId 容器ID
 * @param {Number} videoWidth 容器宽度
 * @param {Number} videoHeight 容器高度
 * @param {String} appkey 综合安防管理平台提供的appkey，必填
 * @param {String} secret 综合安防管理平台提供的secret，必填
 * @param {String} ipAddress 综合安防管理平台IP地址，必填
 * @param {Number} port 综合安防管理平台端口，若启用HTTPS协议，默认443
 * @param {Function} callback 初始化成功时回调函数
 */
class InitHkVideo {
  constructor(
    containerId,
    videoWidth,
    videoHeight,
    appkey,
    secret,
    ipAddress,
    port,
    callback
  ) {
    this.containerId = containerId
    this.width = videoWidth
    this.height = videoHeight
    this.appkey = appkey
    this.secret = secret
    this.ipAddress = ipAddress
    this.port = port
    this.oWebControl = null
    this.pubKey = null
    this.timer = null
    this.initCount = 0
    this.initPlugin(callback)
  }
  initPlugin(callback) {
    this.oWebControl = new WebControl({
      szPluginContainer: this.containerId, // 指定容器id
      iServicePortStart: 15900, // 指定起止端口号，建议使用该值
      iServicePortEnd: 15900,
      szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11', // 用于IE10使用ActiveX的clsid
      cbConnectSuccess: () => {
        // 创建WebControl实例成功
        this.oWebControl
          .JS_StartService('window', {
            // WebControl实例创建成功后需要启动服务
            dllPath: './VideoPluginConnect.dll' // 值"./VideoPluginConnect.dll"写死
          })
          .then(
            () => {
              // 启动插件服务成功
              this.oWebControl.JS_SetWindowControlCallback({
                // 设置消息回调
                cbIntegrationCallBack: this.cbIntegrationCallBack
              })

              this.oWebControl
                .JS_CreateWnd(this.containerId, this.width, this.height)
                .then(() => {
                  //JS_CreateWnd创建视频播放窗口，宽高可设定
                  this.init(callback) // 创建播放实例成功后初始化
                })
            },
            err => {
              console.log(err)
              // 启动插件服务失败
            }
          )
      },
      cbConnectError: () => {
        // 创建WebControl实例失败
        this.oWebControl = null
        $(`#${this.containerId}`).html('插件未启动，正在尝试启动，请稍候...')
        window.WebControl.JS_WakeUp('VideoWebPlugin://') // 程序未启动时执行error函数，采用wakeup来启动程序
        this.initCount++
        if (this.initCount < 3) {
          this.timer = setTimeout(() => {
            this.initPlugin()
          }, 3000)
        } else {
          $(`#${this.containerId}`).html('插件启动失败，请检查插件是否安装！')
        }
      },
      cbConnectClose: bNormalClose => {
        // 异常断开：bNormalClose = false
        // JS_Disconnect正常断开：bNormalClose = true
        console.log('cbConnectClose')
        this.oWebControl = null
        $(`#${this.containerId}`).html('插件未启动，正在尝试启动，请稍候...')
        window.WebControl.JS_WakeUp('VideoWebPlugin://')
        this.initCount++
        if (this.initCount < 3) {
          this.timer = setTimeout(() => {
            this.initPlugin()
          }, 3000)
        } else {
          $(`#${this.containerId}`).html('插件启动失败，请检查插件是否安装！')
        }
      }
    })
  }
  init(callback) {
    this.getPubKey(() => {
      ////////////////////////////////// 请自行修改以下变量值	////////////////////////////////////
      const appkey = this.appkey //综合安防管理平台提供的appkey，必填
      const secret = this.setEncrypt(this.secret) //综合安防管理平台提供的secret，必填
      const ip = this.ipAddress //综合安防管理平台IP地址，必填
      const playMode = 0 //初始播放模式：0-预览，1-回放
      const port = this.port //综合安防管理平台端口，若启用HTTPS协议，默认443
      const snapDir = 'D:\\SnapDir' //抓图存储路径
      const videoDir = 'D:\\VideoDir' //紧急录像或录像剪辑存储路径
      const layout = '1x1' //playMode指定模式的布局
      const enableHTTPS = 1 //是否启用HTTPS协议与综合安防管理平台交互，这里总是填1
      const encryptedFields = 'secret' //加密字段，默认加密领域为secret
      const showToolbar = 1 //是否显示工具栏，0-不显示，非0-显示
      const showSmart = 1 //是否显示智能信息（如配置移动侦测后画面上的线框），0-不显示，非0-显示
      const buttonIDs = '0,16,256,257,258,259,260,512,513,514,515,516,517,768,769' //自定义工具条按钮
      const reconnectTimes = 3
      ////////////////////////////////// 请自行修改以上变量值	////////////////////////////////////

      this.oWebControl
        .JS_RequestInterface({
          funcName: 'init',
          argument: JSON.stringify({
            appkey: appkey, //API网关提供的appkey
            secret: secret, //API网关提供的secret
            ip: ip, //API网关IP地址
            playMode: playMode, //播放模式（决定显示预览还是回放界面）
            port: port, //端口
            snapDir: snapDir, //抓图存储路径
            videoDir: videoDir, //紧急录像或录像剪辑存储路径
            layout: layout, //布局
            enableHTTPS: enableHTTPS, //是否启用HTTPS协议
            encryptedFields: encryptedFields, //加密字段
            showToolbar: showToolbar, //是否显示工具栏
            showSmart: showSmart, //是否显示智能信息
            buttonIDs: buttonIDs, //自定义工具条按钮
            reconnectTimes: reconnectTimes // 重连次数
          })
        })
        .then(oData => {
          this.oWebControl.JS_Resize(this.width, this.height) // 初始化后resize一次，规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
          callback() //初始化成功的回调函数
        })
    })
  }
  // 开始预览
  startVideoPreview(cameraIndexCode) {
    // 2673e931d5304d18ad65749cb40604cd
    // const cameraIndexCode = 'a8ca48ffc26647f49912a6af6262915d' //获取输入的监控点编号值，必填
    const streamMode = 0 //主子码流标识：0-主码流，1-子码流
    const transMode = 1 //传输协议：0-UDP，1-TCP
    const gpuMode = 0 //是否启用GPU硬解，0-不启用，1-启用
    const wndId = -1 //播放窗口序号（在2x2以上布局下可指定播放窗口)
    this.oWebControl
      .JS_RequestInterface({
        funcName: 'startPreview',
        argument: JSON.stringify({
          cameraIndexCode: cameraIndexCode, //监控点编号
          streamMode: streamMode, //主子码流标识
          transMode: transMode, //传输协议
          gpuMode: gpuMode, //是否开启GPU硬解
          wndId: wndId //可指定播放窗口
        })
      })
      .then(res => {
        console.log('播放成功', res)
      })
      .catch(err => {
        console.log(err)
      })
  }
  // 开始回放
  startVideoPlayBack(cameraIndexCode, startTimeStamp, endTimeStamp) {
    this.oWebControl
      .JS_RequestInterface({
        funcName: 'startPlayback',
        argument: JSON.stringify({
          cameraIndexCode, //监控点编号，必填
          startTimeStamp, // 录像查询开始时间戳，单位：秒
          endTimeStamp, // 录像查询结束时间戳，单位：秒
          recordLocation: 1, // 录像存储类型 0-中心存储 1-设备存储
          transMode: 1, // 传输协议 ，0-UDP 1-TCP
          gpuMode: 0 // 是否开启 GPU 硬解，0-不开启 1-开
          // wndId: -1 //可指定播放窗口
        })
      })
      .then(res => {
        console.log('播放成功', res)
      })
      .catch(err => {
        console.log(err)
      })
  }
  //获取公钥
  getPubKey(callback) {
    this.oWebControl
      .JS_RequestInterface({
        funcName: 'getRSAPubKey',
        argument: JSON.stringify({
          keyLength: 1024
        })
      })
      .then(oData => {
        console.log(oData)
        if (oData.responseMsg.data) {
          this.pubKey = oData.responseMsg.data
          callback()
        }
      })
  }
  //RSA加密
  setEncrypt(value) {
    var encrypt = new JSEncrypt()
    encrypt.setPublicKey(this.pubKey)
    return encrypt.encrypt(value)
  }
  cbIntegrationCallBack(oData) {
    // console.log(oData)
    // showCBInfo(JSON.stringify(oData.responseMsg))
  }
  clearTimer() {
    clearTimeout(this.timer)
    this.timer = null
  }
}

export default InitHkVideo
